/*
 * DC jQuery Vertical Accordion Menu - jQuery vertical accordion menu plugin
 * Copyright (c) 2011 Design Chemical
 *
 * Dual licensed under the MIT and GPL licenses:
 * 	http://www.opensource.org/licenses/mit-license.php
 * 	http://www.gnu.org/licenses/gpl.html
 *
 */


// 四级菜单
(function($){
	$.fn.dcAccordion = function(options) {
		// 默认设置
		var defaults = {
			classParent: 'dcjq-parent',
			classActive: 'active',
			classArrow: 'dcjq-icon',
			classCount: 'dcjq-count',
			classExpand: 'dcjq-current-parent',
			eventType: 'click',
			hoverDelay: 300,
			menuClose: true,
			autoClose: true,
			autoExpand: false,
			speed: 'slow',
			saveState: true,
			disableLink: true,
			showCount: false,
			//	cookie	: 'dcjq-accordion'
		};

		// 合并用户设置和默认设置，
		var options = $.extend(defaults, options);
		this.each(function (opt) {// 之前，为什么这个回调函数的参数是 options，上面的那个 options 变量还怎么用？
			var obj = this;
			// console.log(obj);//ul#nav-accordion.sidebar-nemu

			var $ul = $(this);

			// css 已经设置了除了obj外的所有的url都是隐藏的

			var highlightClass = 'ls' + jsId;

			// 当前处于激活状态的一级菜单对应的 li 元素。
			$activeLevelOneLi = $('#' + jsController);
			// 当前处于激活状态的 a 元素。
			$activeA = $('.' + highlightClass, $activeLevelOneLi);
			// 当前处于激活状态的 a 元素。
			$activeLi = $('.' + highlightClass, $activeLevelOneLi).parent();

			
			// 如果当前 url 就是一级菜单上的 url
			$ul.children('li').each(function(index1, el1) {
				var $one = $(this);
				// console.log(jsController);
				if ($one.attr('id') == jsController) {
					// 突出显示一级菜单
					$one.children('a').eq(0).addClass(options.classActive);//    children('a').eq(0).

					// 当前激活的一级菜单，如果有二级菜单，则展开
					if ($one.children('ul').length > 0) {

						// 展开二级菜单
						$one.children('ul').slideDown(options.speed);

						// url 在一级菜单上
						if ($one.hasClass(jsAction)) {
							// 已经展开了二级菜单
						} else {
							// url 不在一级菜单上，那有可能是在二级、三级甚至四级菜单上。
							// 不管是二级、三级还是四级，都首先要把一级菜单突出显示，上面已经做过了。
							
							// 标识 url 是否在二级菜单上
							var twoFlag = false;

							// url 是否二级菜单上
							$one.find('li.level-two').each(function(index2, el2) {
								var $two = $(this);
								if ($two.hasClass(highlightClass)) {
									twoFlag = true;
									// 如果在某个二级菜单上，把该二级菜单高亮，如果其下有三级菜单则展开
									$two.children('a').eq(0).addClass(options.classActive);
									if ($two.children('ul').length > 0) {
										$two.children('ul').slideDown(options.speed);
									}
								} else {
									// 缺省
								}
							});							

							// 说明不在二级菜单上，那就判断三级菜单
							if (!twoFlag) {
								// 先把当前激活状态 a 元素所属二级菜单展开，并把该二级菜单高亮
								$activeA.parents('li.level-two').children('ul').slideDown(options.speed);
								$activeA.parents('li.level-two').children('a.level-two').addClass(options.classActive);

								// 标识 url 是否在三级菜单上
								var threeFlag = false;

								// url 是否在三级菜单上
								$one.find('li.level-three').each(function(index2, el2) {
									var $three = $(this);
									if ($three.hasClass(highlightClass)) {
										threeFlag = true;
										// 如果在某个三级菜单上，把该三级菜单高亮，如果其下有四级菜单则展开
										$three.children('a').eq(0).addClass(options.classActive);
										if ($three.children('ul').length > 0) {
											$three.children('ul').slideDown(options.speed);
										}
									} else {
										// 缺省
									}
								});


								// 说明不在三级菜单上，那就判断四级菜单（因为只有四级，所以肯定有的）
								if (!threeFlag) {
									// 当前处于激活状态的四级菜单高亮，所属三级菜单也高亮并同时展开
									$activeA.addClass(options.classActive);
									$activeA.parents('li.level-three').children('a.level-three').eq(0).addClass(options.classActive);
									$activeA.parents('li.level-three').children('ul').slideDown(options.speed);
								}
							}
						}
					} else {
						// 当前激活的一级菜单没有子菜单
					}
				} else {
					// 控制器不对应任何一个一级菜单，这是不可能的
				}
			});

			// 有的一级菜单可能没有 url
			// 必定有子菜单，否则这个一级菜单就没有存在的意义了
			// 那么点击该一级菜单之后应该弹出子菜单
			/*$('li', obj).each(function(index, el) {
				var _this = this;

				if ($(_this).children('a').attr('_url') == -1) {
					$(_this).on('click', function(event) {
						if($(_this).hasClass('level-one'))
						{
							$('li.level-one').each(function(index2, el2) {
								if($(this).children('a').hasClass(options.classActive))
								{
									$(this).children('a').removeClass(options.classActive)
								}
							});

							$(_this).children('a').addClass(options.classActive);
						}						

						if ($(_this).children('ul').length > 0) {
							$('li', obj).each(function(index2, ele) {
								var _that = this;
								if ($(_that).children('ul').is(':visible')) {
									$(_that).children('ul').slideUp(options.speed);
								}
							});	
							$(_this).children('ul').slideDown(options.speed);
						}
						// event.preventDefault();
					});
				} else {
					// != -1
					// 点击的菜单具有 url 功能
					$(_this).on('click', function(event) {
						// 如果已经展开了，再次点击本按钮，阻止	
						console.log($(_this).children('a').eq(0).hasClass(options.classActive));
						event.preventDefault();				
						if($(_this).children('a').eq(0).hasClass(options.classActive))
						{
console.log('11111111111');
console.log($(_this));
							event.preventDefault();
						} else {
							// 当前点击的菜单之前闭合的
console.log('22222222222222');
							if($(_this).hasClass('level-one'))
							{
								$('li.level-one').each(function(index2, el2) {
									if($(this).children('a').hasClass(options.classActive))
									{
										$(this).children('a').removeClass(options.classActive)
									}
								});

								$(_this).children('a').addClass(options.classActive);
							}						

							if ($(_this).children('ul').length > 0) {
								$('li', obj).each(function(index2, ele) {
									var _that = this;
									if ($(_that).children('ul').is(':visible')) {
										$(_that).children('ul').slideUp(options.speed);
									}
								});	
								$(_this).children('ul').slideDown(options.speed);
							}
							// event.preventDefault();
						}
					});
				}
			});*/

			// 在 li 上触发点击事件，发现有bug，因为一个 li 元素下面可能有其他的 li，导致点击一次触发多次点击事件
			// a 元素则是最小的，应该在 a 上触发点击事件
			$('a', obj).each(function(index, el) {
				// 当前的 a 元素
				var $click_a = $(this);
				// 当前的 a 元素的父 li 元素
				var $click_li = $click_a.parent('li');

				// 点击事件处理
				$click_a.on('click', function(event){
					// 检查当前点击的 a 是不是上次点击过的
					// 如果是，什么都不做
					// 如果不是，则突出显示
					/*if ($click_a.hasClass(options.classActive)) {
						event.preventDefault();
						return false;
					} else {
						// 给当前 a 元素添加 active 类
						// 所有与 $click_li 同级的 li 元素的直接子元素 a，如果有 current 类则删除
						$click_a.addClass(options.classActive);
						$click_li.siblings('li').each(function(index2, el2){
							if($(this).children('a').eq(0).hasClass(options.classActive))
							{
								$(this).children('a').eq(0).removeClass(options.classActive)
							}
						});
					}*/

					// 当前 a 元素不具有 url 功能
					// 那么它下面一定有子菜单，否则此菜单没有存在的意义
					if($click_a.attr('_url') == '-1')
					{
						// 同级的 li 如果展开了则折叠
						$click_li.siblings().children('ul').slideUp(options.speed);
						$click_li.siblings().children().removeClass(options.classActive);

						// 展开或者闭合子菜单
						// 虽然说应该一定要有子菜单，但还是要判断一下
						if($click_li.children('ul').length > 0)
						{
							// 如果当前一级菜单处于闭合状态则展开，处于展开状态则闭合
							// 已经处于展开状态，说明本次和上次点击的是
							if($click_a.hasClass(options.classActive))
							{
								// 说明之前是展开的
								if(($click_a.attr('_flag') == 'opened') || ($click_a.attr('_flag') == undefined))
								{
									$click_li.children('ul').slideUp(options.speed);
									$click_a.attr('_flag', 'closed');
								} else {
									$click_li.children('ul').slideDown(options.speed);
									$click_a.attr('_flag', 'opened');
								}
							} else {
								// 首先突出显示
								$click_a.addClass(options.classActive);
								$click_a.attr('_flag', 'opened')
								$click_li.children('ul').slideDown(options.speed);
							}
						} else {
							// 该一级菜单下没有子菜单，什么都不做
						}
					} else {
						// 具有 url 功能就直接跳转了，这里不需要处理
					}
				});
				
				
			});
		});
	};
})(jQuery);


/**
 * 最初的代码

(function($){

	$.fn.dcAccordion = function(options) {

		//set default options 
		var defaults = {
			classParent	 : 'dcjq-parent',
			classActive	 : 'active',
			classArrow	 : 'dcjq-icon',
			classCount	 : 'dcjq-count',
			classExpand	 : 'dcjq-current-parent',
			eventType	 : 'click',
			hoverDelay	 : 300,
			menuClose     : true,
			autoClose    : true,
			autoExpand	 : false,
			speed        : 'slow',
			saveState	 : true,
			disableLink	 : true,
			showCount : false,
//			cookie	: 'dcjq-accordion'
		};

		//call in the default otions
		var options = $.extend(defaults, options);

		this.each(function(options){

			var obj = this;
			setUpAccordion();
//			if(defaults.saveState == true){
//				checkCookie(defaults.cookie, obj);
//			}
			if(defaults.autoExpand == true){
				$('li.'+defaults.classExpand+' > a').addClass(defaults.classActive);
			}
			resetAccordion();

			if(defaults.eventType == 'hover'){

				var config = {
					sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
					interval: defaults.hoverDelay, // number = milliseconds for onMouseOver polling interval
					over: linkOver, // function = onMouseOver callback (REQUIRED)
					timeout: defaults.hoverDelay, // number = milliseconds delay before onMouseOut
					out: linkOut // function = onMouseOut callback (REQUIRED)
				};

				$('li a',obj).hoverIntent(config);
				var configMenu = {
					sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
					interval: 1000, // number = milliseconds for onMouseOver polling interval
					over: menuOver, // function = onMouseOver callback (REQUIRED)
					timeout: 1000, // number = milliseconds delay before onMouseOut
					out: menuOut // function = onMouseOut callback (REQUIRED)
				};

				$(obj).hoverIntent(configMenu);

				// Disable parent links
				if(defaults.disableLink == true){

					$('li a',obj).click(function(e){
						if($(this).siblings('ul').length >0){
							e.preventDefault();
						}
					});
				}

			} else {
			
				$('li a',obj).click(function(e){

					$activeLi = $(this).parent('li');
					$parentsLi = $activeLi.parents('li');
					$parentsUl = $activeLi.parents('ul');

					// Prevent browsing to link if has child links
					if(defaults.disableLink == true){
						if($(this).siblings('ul').length >0){
							e.preventDefault();
						}
					}

					// Auto close sibling menus
					if(defaults.autoClose == true){
						autoCloseAccordion($parentsLi, $parentsUl);
					}

					if ($('> ul',$activeLi).is(':visible')){
						$('ul',$activeLi).slideUp(defaults.speed);
						$('a',$activeLi).removeClass(defaults.classActive);
					} else {
						$(this).siblings('ul').slideToggle(defaults.speed);
						$('> a',$activeLi).addClass(defaults.classActive);
					}
					
//					// Write cookie if save state is on
//					if(defaults.saveState == true){
//						createCookie(defaults.cookie, obj);
//					}
				});
			}

			// Set up accordion
			function setUpAccordion(){

				$arrow = '<span class="'+defaults.classArrow+'"></span>';
				var classParentLi = defaults.classParent+'-li';
				$('> ul',obj).show();
				$('li',obj).each(function(){
					if($('> ul',this).length > 0){
						$(this).addClass(classParentLi);
						$('> a',this).addClass(defaults.classParent).append($arrow);
					}
				});
				$('> ul',obj).hide();
				if(defaults.showCount == true){
					$('li.'+classParentLi,obj).each(function(){
						if(defaults.disableLink == true){
							var getCount = parseInt($('ul a:not(.'+defaults.classParent+')',this).length);
						} else {
							var getCount = parseInt($('ul a',this).length);
						}
						$('> a',this).append(' <span class="'+defaults.classCount+'">'+getCount+'</span>');
					});
				}
			}
			
			function linkOver(){

			$activeLi = $(this).parent('li');
			$parentsLi = $activeLi.parents('li');
			$parentsUl = $activeLi.parents('ul');

			// Auto close sibling menus
			if(defaults.autoClose == true){
				autoCloseAccordion($parentsLi, $parentsUl);

			}

			if ($('> ul',$activeLi).is(':visible')){
				$('ul',$activeLi).slideUp(defaults.speed);
				$('a',$activeLi).removeClass(defaults.classActive);
			} else {
				$(this).siblings('ul').slideToggle(defaults.speed);
				$('> a',$activeLi).addClass(defaults.classActive);
			}

			// Write cookie if save state is on
			if(defaults.saveState == true){
				createCookie(defaults.cookie, obj);
			}
		}

		function linkOut(){
		}

		function menuOver(){
		}

		function menuOut(){

			if(defaults.menuClose == true){
				$('ul',obj).slideUp(defaults.speed);
				// Reset active links
				$('a',obj).removeClass(defaults.classActive);
				createCookie(defaults.cookie, obj);
			}
		}

		// Auto-Close Open Menu Items
		function autoCloseAccordion($parentsLi, $parentsUl){
			$('ul',obj).not($parentsUl).slideUp(defaults.speed);
			// Reset active links
			$('a',obj).removeClass(defaults.classActive);
			$('> a',$parentsLi).addClass(defaults.classActive);
		}
		// Reset accordion using active links
		function resetAccordion(){
			$('ul',obj).hide();
			$allActiveLi = $('a.'+defaults.classActive,obj);
			$allActiveLi.siblings('ul').show();
		}
		});

		// Retrieve cookie value and set active items
//		function checkCookie(cookieId, obj){
//			var cookieVal = $.cookie(cookieId);
//			if(cookieVal != null){
//				// create array from cookie string
//				var activeArray = cookieVal.split(',');
//				$.each(activeArray, function(index,value){
//					var $cookieLi = $('li:eq('+value+')',obj);
//					$('> a',$cookieLi).addClass(defaults.classActive);
//					var $parentsLi = $cookieLi.parents('li');
//					$('> a',$parentsLi).addClass(defaults.classActive);
//				});
//			}
//		}

		// Write cookie
//		function createCookie(cookieId, obj){
//			var activeIndex = [];
//			// Create array of active items index value
//			$('li a.'+defaults.classActive,obj).each(function(i){
//				var $arrayItem = $(this).parent('li');
//				var itemIndex = $('li',obj).index($arrayItem);
//					activeIndex.push(itemIndex);
//				});
//			// Store in cookie
//			$.cookie(cookieId, activeIndex, { path: '/' });
//		}
	};
})(jQuery);*/


/**
 * 二次修改后的代码（三级菜单）
 *
(function($){

    $.fn.dcAccordion = function(options) {

        //set default options
        var defaults = {
            outerUlClass : 'sidebar-menu',// 自定义，最外层ul的类，唯一
            classParent	 : 'dcjq-parent',
            classActive	 : 'active',
            classArrow	 : 'dcjq-icon',
            classCount	 : 'dcjq-count',
            classExpand	 : 'dcjq-current-parent',
            eventType	 : 'click',
            hoverDelay	 : 300,
            menuClose    : true,
            autoClose    : true,
            autoExpand	 : true, // false,
            speed        : 'slow',
            saveState	 : true,
            disableLink	 : true,
            showCount 	 : false,
//			cookie	: 'dcjq-accordion'
        };

        //call in the default otions
        var options = $.extend(defaults, options);

        var activeClass = defaults.classActive;

        this.each(function(options){
            // console.log(123);
            // console.log(this);//最外层的大 ul 元素
            // console.log(456);
            var obj = this;


            var $activeLii = $('#' + jsController);
            $activeLii.children('a').addClass(activeClass);


            if($activeLii.children('ul').length > 0)
            {

                $activeLii.children('ul').each(function(){
                    if($(this).find('ul').length > 0)
                    {
                        //$(this).find('ul').slideUp(defaults.speed);
                        $(this).find('ul').hide();
                    }
                });
                $activeLii.children('ul').slideDown(defaults.speed);

            }

            // 三级菜单字体高亮
            if($('#' + jsAction).parents('li').attr('id') != jsController)
            {
                $('#' + jsAction).parent().prev('a').css('color', '#fff');
                $('#' + jsAction).parents('ul').slideDown(defaults.speed);
            }
            $('#' + jsAction).children('a').css('color', '#fff');

            // 一级菜单
            $('> li > a',obj).click(function(e){
                var $this = $(this);
                $activeLi = $this.parent('li');

                // 当前点击的 a 元素，如果有同级的菜单 ul，超链接不要进行跳转
                if(defaults.disableLink == true){
                    if($this.siblings('ul').length >0){
                        e.preventDefault();
                    }
                }

                if($this.next('ul').find('ul').length == 0)
                {
                    toggle($this, $activeLi, 2);
                } else if($this.next('ul').find('ul').length > 0){
                    // 该一级菜单下有二级菜单和三级菜单
                    toggle($this, $activeLi, 3);
                }

            });

            // 点击第二级菜单
            $('> li > ul > li > a',obj).click(function(e){
                console.log('二级菜单');
                console.log($(this).html());
                var $this2 = $(this);
                $activeLi2 = $this2.parent('li');

                // 当前点击的 a 元素，如果有同级的菜单 ul，超链接不要进行跳转
                if(defaults.disableLink == true){
                    if($this2.siblings('ul').length >0){
                        e.preventDefault();
                    }
                }
                $this2.css({});

                // 此二级菜单也分两种情况，1没有三级菜单（不做任何处理），2有三级菜单
                // 有三级菜单的情况
                if($this2.next('ul').length > 0)
                {
                    if ($('> ul',$activeLi2).is(':visible'))
                    {
                        $('> ul',$activeLi2).slideUp(defaults.speed);
                    } else {
                        $activeLi2.children('ul').slideDown(defaults.speed);
                        $activeLi2.siblings('li').children('ul').each(function(){
                            if($(this).is(':visible'))
                            {
                                $(this).slideUp(defaults.speed);
                            }
                        });
                    }
                }

            });


            function toggle($this, $activeLi, level)
            {
                // 点击的是同一个一级菜单
                if ($('> ul',$activeLi).is(':visible'))
                {
                    $('ul',$activeLi).slideUp(defaults.speed);
                    $('a',$activeLi).removeClass(activeClass);
                } else {
                    // 点击了其他一级菜单
                    // 新菜单要展开，其他展开的菜单要闭合
                    $this.addClass(activeClass);
                    // 如果有三级菜单，则第三级要闭合
                    if(level == 3)
                    {
                        $activeLi.children('ul').find('ul').each(function(){
                            $(this).hide();
                        });
                    }
                    $activeLi.children('ul').slideDown(defaults.speed);


                    $activeLi.siblings('li').children('a').each(function(){
                        if($(this).hasClass(activeClass))
                        {
                            $(this).removeClass(activeClass);
                        }
                    });
                    $activeLi.siblings('li').children('ul').each(function(){
                        if($(this).is(':visible'))
                        {
                            $(this).slideUp(defaults.speed);
                        }
                    });
                }
            }
        });
    };
})(jQuery);
*/


